 /**
  * @file main.cpp
  * @brief Main entry point for the OpenVINO YOLO model inference application.
  *
  * This program reads images from a specified folder, performs batch inference using
  * a YOLO model via OpenVINO, and outputs the results.
  *
  * @author [ZongYue]
  * @date [2024.11.8]
  * @version 1.0
  */

 #include <iostream> // 包含输入/输出流库
 #include <string>   // 包含字符串库
 #include <vector>   // 包含向量库
 #include <filesystem> // 包含文件系统库

 #include "model_infer_vino.h" // 包含其他自定义头文件
 #include "o_txr_algo_dlm_v5.h"
 #include "../tk_utility/tk_data_type.h"  // 包含定义基本数据类型的头文件。
 #include "../txr_algo_dlm/txr_algo_dlm_define.h"
 #include "../txr_algo_dlm/txr_algo_dlm_impl.h"

 #include <QRgb>

 using namespace cv; // 使用 OpenCV 命名空间
 using namespace dnn; // 使用 OpenCV DNN 命名空间
 using namespace ov; // 使用 OpenVINO 命名空间
 using namespace std; // 使用标准命名空间
 using namespace txr_algo_dlm;


 // 命名空间用于文件系统操作
 namespace fs = std::filesystem;

 // 独立的函数，用于读取文件夹下的前N个图像文件
 std::vector<txr_algo_dlm::st_detect_unit> ReadImagesFromFolder(const std::string& folderPath, int N) {
     std::vector<txr_algo_dlm::st_detect_unit> imageUnits;
     fs::path folderPathObj(folderPath);
     if (!fs::exists(folderPathObj) || !fs::is_directory(folderPathObj)) {
         std::cerr << "Error: Folder does not exist or is not a directory." << std::endl;
         return imageUnits;
     }

     std::vector<fs::path> imagePaths; // 存储找到的图像文件路径
     for (const auto& entry : fs::directory_iterator(folderPathObj)) {
         if (entry.is_regular_file()) {
             std::string extension = entry.path().extension().string();
             // 检查文件扩展名是否为图像文件格式，这里以jpg和png为例
             if (extension == ".jpg" || extension == ".jpeg" || extension == ".png") {
                 imagePaths.push_back(entry.path());
             }
         }
         if (imagePaths.size() >= static_cast<size_t>(N)) break; // 如果找到了N个文件，停止搜索
     }

     for (const auto& imagePath : imagePaths) {
         cv::Mat image = cv::imread(imagePath.string(), cv::IMREAD_COLOR);
         if (image.empty()) {
             std::cerr << "Error: Failed to read image " << imagePath.string() << std::endl;
             continue; // 如果读取失败，跳过这个文件
         }

         txr_algo_dlm::st_detect_unit unit;
         unit.img.w = image.cols;
         unit.img.h = image.rows;

         // 分配内存并转换图像数据
         unit.img.pp_rgb8[0] = new tk_uint8[image.rows * image.cols];
         unit.img.pp_rgb8[1] = new tk_uint8[image.rows * image.cols];
         unit.img.pp_rgb8[2] = new tk_uint8[image.rows * image.cols];

         for (int i = 0; i < image.rows; ++i) {
             for (int j = 0; j < image.cols; ++j) {
                 cv::Vec3b &pixel = image.at<cv::Vec3b>(i, j);
                 unit.img.pp_rgb8[0][i * image.cols + j] = pixel[2]; // B
                 unit.img.pp_rgb8[1][i * image.cols + j] = pixel[1]; // G
                 unit.img.pp_rgb8[2][i * image.cols + j] = pixel[0]; // R
             }
         }

         imageUnits.push_back(unit); // 将转换后的图像单元添加到数组中
     }

     return imageUnits; // 返回包含N个图像单元的数组
 }


 int main() {
     // 创建TxrAlgoDlmV4对象
     // txr_algo_dlm::TxrAlgoDlmV4 detector;


     // 创建TxrAlgoDlmV4对象
     o_TxrAlgoDlmV5 dlm;

     // 创建并初始化配置结构体
     st_dlm_cfg cfg;  // 创建结构体实例
     // 要设置的文件路径
     const std::string path = "./sp3v1";
     // 检查路径长度，确保不会超出数组边界
     if (path.size() < MAX_PATH_BYTES) {
         // 使用 std::string 的 copy 方法将路径复制到 file_path_name 字段
         path.copy(cfg.file_path_name, path.size());
         cfg.file_path_name[path.size()] = '\0';  // 确保字符串以空字符结尾
     } else {
         std::cerr << "Error: Path is too long!" << std::endl;
     }
     // 输出结果以验证
     std::cout << "Model Path: " << cfg.file_path_name << std::endl;


     // 加载模型
     if (dlm.Load(cfg)) {
         std::cout << "Model loaded successfully." << std::endl;
     } else {
         std::cout << "Failed to load model." << std::endl;
         return -1;
     }

//     // 读取文件夹下的前N个图像文件
//     std::string folderPath = "generate"; // 替换为你的文件夹路径
//     int N = 5; // 你想要读取的图像文件数量
//     std::vector<txr_algo_dlm::st_detect_unit> imageUnits = ReadImagesFromFolder(folderPath, N);
//
//     // 将vector转换为数组并调用Detect函数
//     txr_algo_dlm::st_detect_unit* unitArray = imageUnits.data();
//     int size = static_cast<int>(imageUnits.size());
//     cout << "Number of detected units: " << size << endl;
//     dlm.Detect(unitArray, size);
//
//     // 释放内存
//     for (auto& unit : imageUnits) {
//         delete[] unit.img.pp_rgb8[0];
//         delete[] unit.img.pp_rgb8[1];
//         delete[] unit.img.pp_rgb8[2];
//     }
//
     return 0;
 }
